package org.example.pointer;

/**
 * 反转链表
 * @author Abner G
 * @date 2022/5/12 22:55
 */
public class practicePointer02 {

    /**
     * 题目
     * 提供单向链表的头节点head,请反转链表，并返回反转后的链表。
     * 输入：head = [1,2,3,4,5]
     * 输出：[5,4,3,2,1]
     *
     * 思路：
     * 同速指针：链表上两个指针，一个先出发，另一个后出发并以相同的速度跟随
     * 通过临时指针让双指针同步前行
     *
     * 1->2->3->4->5->null
     *
     * 5->4->3->2->1->null
     *
     */

    public ListNode reverseList(ListNode head) {

        //空链表或者只有一个元素的链表，不需要反转
        if (head==null||head.next==null){
            return head;
        }

        ListNode p1=head;
        ListNode p2=null;

        while (p1!=null){

            //temp=3->4->5->null
            ListNode temp=p1.next;
            //反转 1->null
            p1.next=p2;
            //双指针同步往前
            p2=p1;
            p1=temp;
        }

        return p2;
    }



}


class ListNode{

    String value;
    ListNode next;

    public ListNode(String value) {
        this.value = value;
    }

    public ListNode(String value, ListNode next) {
        this.value = value;
        this.next = next;
    }



}
